.data
floatout: .string "Wert %f\n"
x: .float  12.0, 12.0, 3.0, 71.0  //, 6, 8, 2, 1,  3.6, 7.5, 8.8, 17.5 // vector 1
y: .float 19.0, 10.0, 111.0, 12.0  //, 6, 8, 2, 1,  51.3, 8.3, 14.6, 19.0 // vector 2
n: .long 4 // dimension
buffer: .float 0.0, 0.0, 0.0, 0.0 // buffer fuer addition pro iteration


result: .float 0.0 // result

.text
.globl main
main:
movl $0, %ecx


// xmm0 mit buffer fuellen
movups buffer, %xmm0

.forstart:
	cmpl n, %ecx
	jge .forend
	// aktuellen viererblock von x in %xmm0 legen
	leal x(, %ecx, 4), %eax
	movups (%eax), %xmm1
	// aktuellen viererblock von y in %xmm1 legen
	leal y(, %ecx, 4), %eax
	movups (%eax), %xmm2
	// aktuelle viererbloecke paarweise multiplizieren
	mulps %xmm2, %xmm1
	// zwischenergebnisse addieren ()
	addps %xmm1, %xmm0

	addl $4, %ecx // index erhoehen
	jmp .forstart
.forend:

// 4 mal 4 byte fuer buffer xmm0 freigeben
subl $16, %esp
movups %xmm0, (%esp) // buffer komplett auf stack

// result auf st(0) legen
fld result
// alle multiplikationen auf st(0) addieren
fadd 0(%esp)
fadd 4(%esp)
fadd 8(%esp)
fadd 12(%esp)

// stack aufraeumeubl $4, %esp
addl $16, %esp

// ergebnis in result speichern
fstp result

fld result // result in st(0) legen

subl $4, %esp
// st(0) auf stack ablegen
fstpl (%esp) // output
pushl $floatout
call printf
addl $8, %esp

// Exit
movl $1, %eax
int $0x80
